package com.cmos.um.utils;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;


@SuppressWarnings({ "rawtypes", "serial" })
public class RetMap extends LinkedHashMap{


    private final static Logger logger= LoggerFactory.getLogger(RetMap.class);
    /**
     * 【构建】正确的响应MAP
     */
    public RetMap()
    {
        init(null,null,null,null,null);
    }

    /**
     * 【构建】错误的响应MAP——带错误描述
     * @param error_msg
     */
    public RetMap(Logger logger,String error_msg)
    {
        if(logger!=null)
            logger.error(error_msg);

        init("-1000",error_msg,null,null,null);
    }

    /**
     * 【构建】错误的响应MAP——带错误码和错误描述
     * @param  error_code         错误码
     * @param  error_msg          错误描述
     */
    public RetMap(Logger logger,String error_code,String error_msg)
    {
        if(logger!=null)
            logger.error(error_msg);

        init(error_code,error_msg,null,null,null);
    }

    /**
     * 【构建】错误的响应MAP——带错误描述
     * @param error_msg
     */
    //public RetMap(String error_msg)
    // {
    //    init("-1000",error_msg,null,null,null);
    //  }

    /**
     * 【构建】错误的响应MAP——带错误码和错误描述
     * @param  error_code         错误码
     * @param  error_msg          错误描述
     */
    public RetMap(String error_code,String error_msg)
    {
        Map<String,String> object = new LinkedHashMap<>();

        object.put("rtnCode","-9999");
        object.put("rtnMsg",error_msg );

        init(error_code,error_msg,null,null,object);
    }


    /**
     * 【构建】正确的响应MAP——带错误码和错误描述
     * @param  true_msg          错误描述
     */
    public RetMap(String true_msg)
    {
        Map<String,String> object = new LinkedHashMap<>();
        object.put("rtnCode","0");
        object.put("rtnMsg",true_msg );

        init("0","成功",null,null,object);
    }

    /**
     * 【构建】正确的响应MAP——返回单个MAP数据
     * @param  bean               MAP型返回数据
     */
    public RetMap(Map<String,Object>  bean)
    {

        init(null,null,bean,null ,null);
    }

    public RetMap(JSONObject bean,String ngcs)
    {

        initNgcs(null,null,bean,null ,null);
    }

    /**
     * 【构建】正确的响应MAP——返回多个MAP数据
     * @param  beans              MAP数组型返回数据
     */
    public RetMap(List<Map<String,Object>> beans)
    {
        init(null,null,null,beans,null);
    }

    /**
     * 【构建】任意的响应MAP
     * @param  code               错误码
     * @param  msg                错误描述
     * @param  bean               MAP型返回数据
     * @param  beans              MAP数组型返回数据
     * @param  object             任意结构的返回数据
     */
    public RetMap(String code, String msg, Map<String,Object> bean, List<Map<String,Object>> beans,Object object)
    {
        init(code,msg,bean,beans,object);
    }

    /**
     * 【工具】生成响应MAP
     * @param  code               错误码
     * @param  msg                错误描述
     * @param  bean               MAP型返回数据
     * @param  beans              MAP数组型返回数据
     * @param  object             任意结构的返回数据
     * @return Map<String,Object> 响应消息体MAP
     */
    @SuppressWarnings("unchecked")
    private void init(String code, String msg, Map<String,Object> bean, List<Map<String,Object>> beans,Object object)
    {

        put("rtnCode" , "0");
        put("rtnMsg"  , "成功");
        put("bean" ,bean != null ? bean : new HashMap<>());
        put("beans",beans);
        put("object"  , object);

    }

    private void initNgcs(String code, String msg, Map<String,Object> bean, List<Map<String,Object>> beans,Object object)
    {

        put("rtnCode" , "0");
        put("rtnMsg"  , "成功");
        put("bean" ,bean);
        put("beans", null);
        put("object"  , object);

    }

    /**
     * 【工具】封装成CINCCcti可接受的JSONObject
     * @param  toCC               要传送的内容
     * @param  method             要调用的方法
     * @param  operation          在执行operate*操作时的操作方法 0：添加，1：删除，2：修改
     * @return JSONObject 		  CINCCcti可接受的JSONObject
     */
    public static JSONObject toCINCCJSONObject(JSONObject toCC, String method, String operation){
        JSONObject toCCinput = new JSONObject();
        toCCinput.put("context", toCC);
        toCCinput.put("operation", operation);
        JSONObject toCCFinal = new JSONObject();
        toCCFinal.put("method", method);
        toCCFinal.put("input", toCCinput);
        return toCCFinal;
    }

    /**
     * 校验参数
     * @param params 数据
     * @param request
     * @return
     */
    public static RetMap CheckParams(JSONObject params, HttpServletRequest request) {
        int        i;
        String     s;
        //1 获得申请者的IP地址
        String ip = HttpClientUtil.getIpAddr(request);

        //2 检查整理输入参数
        Map<String,Object> P =params;
        try
        {
            if((s=(String)params.getString("params"))==null || s.isEmpty())
                return new RetMap(logger,"来自"+ip+"的请求消息中没有带数据——params参数");
            P= DataUtil.json2Map(P);
        }
        catch(Exception e)
        {
            return new RetMap(logger,"来自"+ip+"的请求消息中params参数格式不正确（不符合JSON格式）");
        }

        return new RetMap();

    }
}
